package com.emerquim.bean.support;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;

import com.emerquim.persistence.dao.EventoDAO;
import com.emerquim.persistence.dao.PContactosDAO;
import com.icesoft.faces.context.effects.JavascriptContext;

/**
 * Clase para manejar la funcionalidad del panel popup
 * para la busqueda de los datos de un reportante que llama seguido
 * @author Felipe Criales
 */
public class PanelPopUpReportante implements Serializable {
	
	/**
	 * Funcionalidad de log
	 */
	private static final Logger log = Logger.getLogger(PanelPopUpReportante.class);

	// ----------------------------------------------------
	// Atributos
	// ----------------------------------------------------
	/**
	 * Atributo para el render del panel
	 */
	private boolean modalRendered;

	/** 
	 * Atributo para guardar el nombre del portante que se quiere buscar
	 */
	private String nombreReportante;

	/**
	 * Atributo para guardar el tipo de reportante en la base de datos
	 */
	private long tipoReportante;

	/**
	 * Atributo para la lista de resultados para el reportante
	 */
	private List resultado;


	/**
	 * Cointructor sin parametross
	 */
	public PanelPopUpReportante() {
		this.inicializarDatos();
	}


	/**
	 * Constructor con parametros
	 * @param modalRendered
	 * @param nombreReportante
	 * @param tipoReportante
	 * @param resultado
	 */
	public PanelPopUpReportante(boolean modalRendered, String nombreReportante,
			long tipoReportante, List resultado) {
		super();
		this.modalRendered = modalRendered;
		this.nombreReportante = nombreReportante;
		this.tipoReportante = tipoReportante;
		this.resultado = resultado;
	}

	/**
	 * Evento para buscar el reportante en la base de datos
	 * @param event El evento
	 */
	public void buscarReportante(ActionEvent event) {
		// 1. Validar que se puede buscar el reportante solo si el nombre tiene datos
		if(nombreReportante.equals("")){
			enviarMensajeUsuario("Debe indicar el nombre del reportante");
		}
		// 2. En caso contrario buscar los datos del reportante en la base de datos dado el tipo
		else{	
			log.info("Buscar reportante: " + this.nombreReportante);
			this.resultado = new ArrayList<Reportante>();
			EventoDAO eventoDao = new EventoDAO();
			PContactosDAO contactoDao = new PContactosDAO();
			try {
				
				// 2.1. Cargar los datos de la tabla de eventos
				List<com.emerquim.persistence.dao.Evento> eventos = new ArrayList<com.emerquim.persistence.dao.Evento>();				
				eventos = eventoDao.encontrarReportantes(this.nombreReportante, String.valueOf(this.tipoReportante));
				if(eventos != null){
					Iterator<com.emerquim.persistence.dao.Evento> itEventos = eventos.iterator();
					while(itEventos.hasNext()){
						com.emerquim.persistence.dao.Evento miEvento = itEventos.next();
						Reportante reportante = new Reportante();
						reportante.setNombre(miEvento.getEveReportante());
						reportante.setTelefono(miEvento.getEveTels());
						reportante.setFax(miEvento.getEveFax());
						reportante.setCorreo(miEvento.getEveCorreo());
						reportante.setDireccion(miEvento.getEveDir());
						reportante.setTipoReportante(miEvento.getTipoReporta());						
						this.resultado.add(reportante);
					}
				}	
				
				// 2.2 Adicionar todos los contactos de la tabla de contactos		
				// Se documento porque los contactos estan duplicados en la tabla de eventos
//				List<PContactos> contactos = new ArrayList<PContactos>();
//				contactos = contactoDao.findByConNomLike(this.nombreReportante);
//				if(contactos != null){
//					Iterator<PContactos> itContactos = contactos.iterator();
//					while(itContactos.hasNext()){
//						PContactos contactoTemp = itContactos.next();
//						Reportante reportante = new Reportante();
//						reportante.setNombre(contactoTemp.getConNom());
//						reportante.setTelefono(contactoTemp.getConTel());
//						reportante.setFax("");
//						reportante.setCorreo(contactoTemp.getConMail());
//						reportante.setDireccion(contactoTemp.getConDir());
//						reportante.setTipoReportante(1); // Particular					
//						this.resultado.add(reportante);
//					}
//				}				
			} catch (HibernateException e) {
				this.enviarMensajeUsuario("Error al consultar los reportantes de la base de datos");
				eventoDao.getSession().getTransaction().rollback();
				contactoDao.getSession().getTransaction().rollback();
				log.error("Error al guardar el evento en la base de datos", e);
			} finally {				
				eventoDao.getSession().close();
				contactoDao.getSession().close();
			}			
		}
	}

	/**
	 * Metodo para limpiar los datos de busqueda y cerrar el modal
	 * @author Felipe Criales
	 */
	public void inicializarDatos(){
		this.modalRendered = false;
		this.nombreReportante = "";
		this.tipoReportante = 1;
		this.resultado = new ArrayList<Reportante>();
	}
	
	/**
	 * Metodo para enviar un mensaje de alerta el usuario
	 * @param mensaje
	 * @author Felipe Criales
	 */
	private void enviarMensajeUsuario(String mensaje){
		String funcion = "alert('"+mensaje+"');";
		JavascriptContext.addJavascriptCall(FacesContext
				.getCurrentInstance(), funcion);
	}

	/**
	 * Evento para cerrar el panel modal
	 * @param event
	 */
	public void cerrarModal(ActionEvent event) {
		modalRendered = !modalRendered;
	}

	/**
	 * @return the modalRendered
	 */
	public boolean isModalRendered() {
		return modalRendered;
	}

	/**
	 * @param modalRendered the modalRendered to set
	 */
	public void setModalRendered(boolean modalRendered) {
		this.modalRendered = modalRendered;
	}

	/**
	 * @return the nombreReportante
	 */
	public String getNombreReportante() {
		return nombreReportante;
	}

	/**
	 * @param nombreReportante the nombreReportante to set
	 */
	public void setNombreReportante(String nombreReportante) {
		this.nombreReportante = nombreReportante;
	}

	/**
	 * @return the tipoReportante
	 */
	public long getTipoReportante() {
		return tipoReportante;
	}

	/**
	 * @param tipoReportante the tipoReportante to set
	 */
	public void setTipoReportante(long tipoReportante) {
		this.tipoReportante = tipoReportante;
	}

	/**
	 * @return the resultado
	 */
	public List getResultado() {
		return resultado;
	}

	/**
	 * @param resultado the resultado to set
	 */
	public void setResultado(List resultado) {
		this.resultado = resultado;
	}
}